JavaScriptãã¶ã€ã³ãã¿ãŒã³ãå®å šç¶²çŸ ããå®è£ ã¬ã€ãã§ãã¹ã¿ãŒããŸããããçæãæ§é ãæ¯ãèãã®åãã¿ãŒã³ãå®è·µçãªã³ãŒãäŸã§åŠã³ãŸãã
JavaScriptãã¶ã€ã³ãã¿ãŒã³ïŒçŸä»£ã®éçºè ã®ããã®å æ¬çãªå®è£ ã¬ã€ã
ã¯ããã«ïŒå ç¢ãªã³ãŒãã®ããã®èšèšå³
å€åã®æ¿ãããœãããŠã§ã¢éçºã®äžçã§ã¯ãåã«åäœããã³ãŒããæžãããšã¯ç¬¬äžæ©ã«éããŸãããçã®èª²é¡ã§ãããããã®éçºè ã®èšŒãšãªãã®ã¯ãã¹ã±ãŒã©ãã«ã§ä¿å®æ§ãé«ããä»ã®äººãçè§£ãå ±åäœæ¥ããããã³ãŒããäœæããããšã§ããããã§ãã¶ã€ã³ãã¿ãŒã³ã圹ç«ã¡ãŸãããããã¯ç¹å®ã®ã¢ã«ãŽãªãºã ãã©ã€ãã©ãªã§ã¯ãªãããœãããŠã§ã¢ã¢ãŒããã¯ãã£ã«ãããç¹°ãè¿ãããåé¡ã解決ããããã®ãé«ã¬ãã«ã§èšèªã«äŸåããªãèšèšå³ãªã®ã§ãã
JavaScriptéçºè ã«ãšã£ãŠããã¶ã€ã³ãã¿ãŒã³ã®çè§£ãšé©çšã¯ãããŸã§ä»¥äžã«éèŠã«ãªã£ãŠããŸããè€éãªããã³ããšã³ããã¬ãŒã ã¯ãŒã¯ããNode.jsäžã®åŒ·åãªããã¯ãšã³ããµãŒãã¹ãŸã§ãã¢ããªã±ãŒã·ã§ã³ãè€éåããã«ã€ããŠãå åºãªã¢ãŒããã¯ãã£åºç€ã¯è²ããŸããããã¶ã€ã³ãã¿ãŒã³ã¯ãã®åºç€ãæäŸããççµåãé¢å¿ã®åé¢ãã³ãŒãã®åå©çšæ§ãä¿é²ãããå®çžŸã®ãã解決çãæç€ºããŸãã
ãã®å æ¬çãªã¬ã€ãã§ã¯ããã¶ã€ã³ãã¿ãŒã³ã®3ã€ã®åºæ¬çãªã«ããŽãªããæç¢ºãªèª¬æãšå®è·µçã§ã¢ãã³ãªJavaScript (ES6+) ã®å®è£ äŸãšãšãã«è§£èª¬ããŸããç§ãã¡ã®ç®æšã¯ãç¹å®ã®åé¡ã«å¯ŸããŠã©ã®ãã¿ãŒã³ã䜿çšãã¹ãããç¹å®ããããããããžã§ã¯ãã§å¹æçã«å®è£ ããããã®ç¥èãçããã«æäŸããããšã§ãã
ãã¶ã€ã³ãã¿ãŒã³ã®3ã€ã®æ±
ãã¶ã€ã³ãã¿ãŒã³ã¯éåžžããããããç°ãªãã¢ãŒããã¯ãã£äžã®èª²é¡ã«åãçµãã3ã€ã®äž»èŠãªã°ã«ãŒãã«åé¡ãããŸãã
- çæãã¿ãŒã³ïŒ ãããã®ãã¿ãŒã³ã¯ãªããžã§ã¯ãçæã®ã¡ã«ããºã ã«çŠç¹ãåœãŠãç¶æ³ã«é©ããæ¹æ³ã§ãªããžã§ã¯ããçæããããšããŸããæ¢åã®ã³ãŒãã®æè»æ§ãšåå©çšæ§ãé«ããŸãã
- æ§é ãã¿ãŒã³ïŒ ãããã®ãã¿ãŒã³ã¯ãªããžã§ã¯ãã®æ§æãæ±ãããªããžã§ã¯ããšã¯ã©ã¹ããã倧ããªæ§é ã«çµã¿ç«ãŠãæ¹æ³ã説æãã€ã€ããã®æ§é ãæè»ãã€å¹ççã«ä¿ã¡ãŸãã
- æ¯ãèããã¿ãŒã³ïŒ ãããã®ãã¿ãŒã³ã¯ã¢ã«ãŽãªãºã ãšãªããžã§ã¯ãéã®è²¬ä»»ã®å²ãåœãŠã«é¢ä¿ããŸãããªããžã§ã¯ããã©ã®ããã«çžäºäœçšãã責任ã忣ãããããèšè¿°ããŸãã
åã«ããŽãªãå®è·µçãªäŸãšå ±ã«èŠãŠãããŸãããã
çæãã¿ãŒã³ïŒãªããžã§ã¯ãçæããã¹ã¿ãŒãã
çæãã¿ãŒã³ã¯æ§ã ãªãªããžã§ã¯ãçæã¡ã«ããºã ãæäŸããæ¢åã®ã³ãŒãã®æè»æ§ãšåå©çšæ§ãé«ããŸããã·ã¹ãã ããã®ãªããžã§ã¯ãã®çæãæ§æã衚çŸã®æ¹æ³ããåãé¢ãããã®ãå©ããŸãã
ã·ã³ã°ã«ãã³ãã¿ãŒã³
æŠå¿µïŒ ã·ã³ã°ã«ãã³ãã¿ãŒã³ã¯ãã¯ã©ã¹ãå¯äžã®ã€ã³ã¹ã¿ã³ã¹ããæããªãããšãä¿èšŒãããã®ã€ã³ã¹ã¿ã³ã¹ãžã®åäžã®ã°ããŒãã«ãªã¢ã¯ã»ã¹ãã€ã³ããæäŸããŸããæ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããããšãã詊ã¿ã¯ãå ã®ã€ã³ã¹ã¿ã³ã¹ãè¿ããŸãã
äžè¬çãªäœ¿çšäŸïŒ ãã®ãã¿ãŒã³ã¯ãå ±æãªãœãŒã¹ãç¶æ ã管çããã®ã«åœ¹ç«ã¡ãŸããäŸãšããŠã¯ãåäžã®ããŒã¿ããŒã¹æ¥ç¶ããŒã«ãã°ããŒãã«ãªèšå®ãããŒãžã£ãŒããŸãã¯ã¢ããªã±ãŒã·ã§ã³å šäœã§çµ±äžãããã¹ããã®ã³ã°ãµãŒãã¹ãªã©ããããŸãã
JavaScriptã§ã®å®è£ ïŒ ã¢ãã³ãªJavaScriptãç¹ã«ES6ã¯ã©ã¹ã䜿çšãããšãã·ã³ã°ã«ãã³ã®å®è£ ã¯ç°¡åã«ãªããŸããã¯ã©ã¹ã®éçããããã£ã䜿çšããŠåäžã®ã€ã³ã¹ã¿ã³ã¹ãä¿æã§ããŸãã
äŸïŒãã¬ãŒãµãŒãã¹ã®ã·ã³ã°ã«ãã³
class Logger { constructor() { if (Logger.instance) { return Logger.instance; } this.logs = []; Logger.instance = this; } log(message) { const timestamp = new Date().toISOString(); this.logs.push({ message, timestamp }); console.log(`${timestamp} - ${message}`); } getLogCount() { return this.logs.length; } } // 'new'ããŒã¯ãŒããåŒã°ããŸãããã³ã³ã¹ãã©ã¯ã¿ã®ããžãã¯ãåäžã®ã€ã³ã¹ã¿ã³ã¹ãä¿èšŒããŸãã const logger1 = new Logger(); const logger2 = new Logger(); console.log("ãã¬ãŒã¯åãã€ã³ã¹ã¿ã³ã¹ãïŒ", logger1 === logger2); // true logger1.log("logger1ããã®æåã®ã¡ãã»ãŒãžã"); logger2.log("logger2ããã®2çªç®ã®ã¡ãã»ãŒãžã"); console.log("åèšãã°æ°:", logger1.getLogCount()); // 2
é·æãšçæïŒ
- é·æïŒ åäžã®ã€ã³ã¹ã¿ã³ã¹ãä¿èšŒãããã°ããŒãã«ãªã¢ã¯ã»ã¹ãã€ã³ããæäŸããéããªããžã§ã¯ãã®è€æ°ã€ã³ã¹ã¿ã³ã¹ãé¿ããããšã§ãªãœãŒã¹ãç¯çŽããŸãã
- çæïŒ ã°ããŒãã«ãªç¶æ ãå°å ¥ãããããã¢ã³ããã¿ãŒã³ãšèŠãªãããããšããããŸããããã«ãããåäœãã¹ããå°é£ã«ãªããŸããäŸåæ§æ³šå ¥ã®ååã«éåããã³ãŒããã·ã³ã°ã«ãã³ã€ã³ã¹ã¿ã³ã¹ã«å¯çµåãããŸãã
ãã¡ã¯ããªãŒãã¿ãŒã³
æŠå¿µïŒ ãã¡ã¯ããªãŒãã¿ãŒã³ã¯ãã¹ãŒããŒã¯ã©ã¹ã§ãªããžã§ã¯ããçæããããã®ã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸããããµãã¯ã©ã¹ãçæããããªããžã§ã¯ãã®åã倿Žã§ããããã«ããŸããããã¯ãå ·è±¡ã¯ã©ã¹ãæå®ããã«ãªããžã§ã¯ããçæããããã«ãå°çšã®ããã¡ã¯ããªãŒãã¡ãœãããŸãã¯ã¯ã©ã¹ã䜿çšããããšã«é¢ãããã®ã§ãã
äžè¬çãªäœ¿çšäŸïŒ ã¯ã©ã¹ãçæããå¿ èŠã®ãããªããžã§ã¯ãã®åãäºæž¬ã§ããªãå Žåããã©ã€ãã©ãªã®å©çšè ã«å éšå®è£ ã®è©³çްãç¥ãããšãªããªããžã§ã¯ããçæããæ¹æ³ãæäŸãããå Žåã«äœ¿çšããŸããäžè¬çãªäŸãšããŠããã©ã¡ãŒã¿ã«åºã¥ããŠç°ãªãã¿ã€ãã®ãŠãŒã¶ãŒïŒç®¡çè ãã¡ã³ããŒãã²ã¹ãïŒãäœæããå ŽåãæããããŸãã
JavaScriptã§ã®å®è£ ïŒ
äŸïŒãŠãŒã¶ãŒãã¡ã¯ããªãŒ
class RegularUser { constructor(name) { this.name = name; this.role = 'Regular'; } viewDashboard() { console.log(`${this.name}ããŠãŒã¶ãŒããã·ã¥ããŒããé²èЧããŠããŸãã`); } } class AdminUser { constructor(name) { this.name = name; this.role = 'Admin'; } viewDashboard() { console.log(`${this.name}ãå®å šãªæš©éã§ç®¡çè ããã·ã¥ããŒããé²èЧããŠããŸãã`); } } class UserFactory { static createUser(type, name) { switch (type.toLowerCase()) { case 'admin': return new AdminUser(name); case 'regular': return new RegularUser(name); default: throw new Error('ç¡å¹ãªãŠãŒã¶ãŒã¿ã€ããæå®ãããŸããã'); } } } const admin = UserFactory.createUser('admin', 'Alice'); const regularUser = UserFactory.createUser('regular', 'Bob'); admin.viewDashboard(); // Aliceãå®å šãªæš©éã§ç®¡çè ããã·ã¥ããŒããé²èЧããŠããŸãã regularUser.viewDashboard(); // BobããŠãŒã¶ãŒããã·ã¥ããŒããé²èЧããŠããŸãã console.log(admin.role); // Admin console.log(regularUser.role); // Regular
é·æãšçæïŒ
- é·æïŒ ã¯ã©ã€ã¢ã³ãã³ãŒããå ·è±¡ã¯ã©ã¹ããåé¢ããããšã§ãççµåãä¿é²ããŸããæ°ãã補åã¿ã€ãã远å ããã«ã¯ãæ°ããã¯ã©ã¹ãäœæããŠãã¡ã¯ããªãŒãæŽæ°ããã ãã§æžããããã³ãŒãã®æ¡åŒµæ§ãé«ãŸããŸãã
- çæïŒ å€ãã®ç°ãªã補åã¿ã€ããå¿ èŠãªå Žåãã¯ã©ã¹ãæ¥å¢ããã³ãŒãããŒã¹ãããè€éã«ãªãå¯èœæ§ããããŸãã
ãããã¿ã€ããã¿ãŒã³
æŠå¿µïŒ ãããã¿ã€ããã¿ãŒã³ã¯ãããããã¿ã€ãããšããŠç¥ãããæ¢åã®ãªããžã§ã¯ããã³ããŒããŠæ°ãããªããžã§ã¯ããäœæããããšã«é¢ãããã®ã§ãããªããžã§ã¯ããäžããæ§ç¯ãã代ããã«ãäºåã«èšå®ããããªããžã§ã¯ãã®ã¯ããŒã³ãäœæããŸããããã¯ãJavaScriptèªäœããããã¿ã€ãç¶æ¿ãéããŠæ©èœããåºæ¬çãªæ¹æ³ã§ãã
äžè¬çãªäœ¿çšäŸïŒ ãªããžã§ã¯ãã®äœæã³ã¹ããæ¢åã®ãã®ãã³ããŒãããããé«äŸ¡ãŸãã¯è€éãªå Žåã«äŸ¿å©ã§ãããŸããå®è¡æã«åãæå®ããããªããžã§ã¯ããäœæããããã«ã䜿çšãããŸãã
JavaScriptã§ã®å®è£ ïŒ JavaScriptã¯`Object.create()`ãä»ããŠãã®ãã¿ãŒã³ãçµã¿èŸŒã¿ã§ãµããŒãããŠããŸãã
äŸïŒã¯ããŒã³å¯èœãªä¹ãç©ãããã¿ã€ã
const vehiclePrototype = { init: function(model) { this.model = model; }, getModel: function() { return `ãã®ä¹ãç©ã®ã¢ãã«ã¯${this.model}ã§ã`; } }; // vehicleãããã¿ã€ãã«åºã¥ããŠæ°ããè»ãªããžã§ã¯ããäœæ const car = Object.create(vehiclePrototype); car.init('Ford Mustang'); console.log(car.getModel()); // ãã®ä¹ãç©ã®ã¢ãã«ã¯Ford Mustangã§ã // å¥ã®ãªããžã§ã¯ãããã©ãã¯ãäœæ const truck = Object.create(vehiclePrototype); truck.init('Tesla Cybertruck'); console.log(truck.getModel()); // ãã®ä¹ãç©ã®ã¢ãã«ã¯Tesla Cybertruckã§ã
é·æãšçæïŒ
- é·æïŒ è€éãªãªããžã§ã¯ããäœæããéã«ãå€§å¹ ãªããã©ãŒãã³ã¹åäžãæåŸ ã§ããŸããå®è¡æã«ãªããžã§ã¯ãã®ããããã£ã远å ãŸãã¯åé€ã§ããŸãã
- çæïŒ 埪ç°åç §ãæã€ãªããžã§ã¯ãã®ã¯ããŒã³ãäœæããã®ã¯é£ããå ŽåããããŸãããã£ãŒãã³ããŒãå¿ èŠã«ãªãããšãããããã®å®è£ ã¯è€éã«ãªãå¯èœæ§ããããŸãã
æ§é ãã¿ãŒã³ïŒã³ãŒããè³¢ãçµã¿ç«ãŠã
æ§é ãã¿ãŒã³ã¯ããªããžã§ã¯ããšã¯ã©ã¹ãçµã¿åãããŠããã倧ããè€éãªæ§é ã圢æããæ¹æ³ã«é¢ãããã®ã§ããæ§é ãåçŽåããé¢ä¿æ§ãç¹å®ããããšã«çŠç¹ãåœãŠãŠããŸãã
ã¢ããã¿ãŒãã¿ãŒã³
æŠå¿µïŒ ã¢ããã¿ãŒãã¿ãŒã³ã¯ãäºææ§ã®ãªã2ã€ã®ã€ã³ã¿ãŒãã§ãŒã¹éã®æ©æž¡ã圹ãšããŠæ©èœããŸããç¬ç«ããããŸãã¯äºææ§ã®ãªãã€ã³ã¿ãŒãã§ãŒã¹ã®æ©èœãçµåããåäžã®ã¯ã©ã¹ïŒã¢ããã¿ãŒïŒãé¢ãããŸããããã€ã¹ãæµ·å€ã®ã³ã³ã»ã³ãã«å·®ã蟌ãããã®é»æºã¢ããã¿ãŒã®ãããªãã®ã ãšèããŠãã ããã
äžè¬çãªäœ¿çšäŸïŒ ç°ãªãAPIãæåŸ ããæ¢åã®ã¢ããªã±ãŒã·ã§ã³ã«æ°ãããµãŒãããŒãã£ã©ã€ãã©ãªãçµ±åããå Žåããã¬ã¬ã·ãŒã³ãŒããæžãçŽããã«ã¢ãã³ãªã·ã¹ãã ã§åäœãããå Žåãªã©ã§ãã
JavaScriptã§ã®å®è£ ïŒ
äŸïŒæ°ããAPIãå€ãã€ã³ã¿ãŒãã§ãŒã¹ã«é©åããã
// ã¢ããªã±ãŒã·ã§ã³ã䜿çšããå€ãæ¢åã®ã€ã³ã¿ãŒãã§ãŒã¹ class OldCalculator { operation(term1, term2, operation) { switch (operation) { case 'add': return term1 + term2; case 'sub': return term1 - term2; default: return NaN; } } } // ç°ãªãã€ã³ã¿ãŒãã§ãŒã¹ãæã€æ°ããã©ã€ãã©ãª class NewCalculator { add(term1, term2) { return term1 + term2; } subtract(term1, term2) { return term1 - term2; } } // ã¢ããã¿ãŒã¯ã©ã¹ class CalculatorAdapter { constructor() { this.calculator = new NewCalculator(); } operation(term1, term2, operation) { switch (operation) { case 'add': // æ°ããã€ã³ã¿ãŒãã§ãŒã¹ãžã®åŒã³åºããé©åããã return this.calculator.add(term1, term2); case 'sub': return this.calculator.subtract(term1, term2); default: return NaN; } } } // ã¯ã©ã€ã¢ã³ãã³ãŒãã¯ã¢ããã¿ãŒãå€ãèšç®æ©ã®ããã«äœ¿çšã§ããŸã const oldCalc = new OldCalculator(); console.log("å€ãèšç®æ©ã®çµæ:", oldCalc.operation(10, 5, 'add')); // 15 const adaptedCalc = new CalculatorAdapter(); console.log("é©åãããèšç®æ©ã®çµæ:", adaptedCalc.operation(10, 5, 'add')); // 15
é·æãšçæïŒ
- é·æïŒ ã¯ã©ã€ã¢ã³ããã¿ãŒã²ããã€ã³ã¿ãŒãã§ãŒã¹ã®å®è£ ããåé¢ããç°ãªãå®è£ ã亀æå¯èœã«äœ¿çšã§ããããã«ããŸããã³ãŒãã®åå©çšæ§ãé«ããŸãã
- çæïŒ ã³ãŒãã«äœåãªè€éæ§ã®å±€ã远å ããå¯èœæ§ããããŸãã
ãã³ã¬ãŒã¿ãŒãã¿ãŒã³
æŠå¿µïŒ ãã³ã¬ãŒã¿ãŒãã¿ãŒã³ã¯ããªããžã§ã¯ãã®å ã®ã³ãŒãã倿Žããããšãªããæ°ããæ¯ãèãã責任ãåçã«è¿œå ããããšãå¯èœã«ããŸããããã¯ãå ã®ãªããžã§ã¯ããæ°ããæ©èœãå«ãç¹å¥ãªããã³ã¬ãŒã¿ãŒããªããžã§ã¯ãã§ã©ããããããšã«ãã£ãŠå®çŸãããŸãã
äžè¬çãªäœ¿çšäŸïŒ UIã³ã³ããŒãã³ãã«æ©èœã远å ãããããŠãŒã¶ãŒãªããžã§ã¯ãã«æš©éãä»äžãããããµãŒãã¹ã«ãã®ã³ã°/ãã£ãã·ã³ã°ã®æ¯ãèãã远å ãããããå Žåã§ãããµãã¯ã©ã¹åã«å¯Ÿããæè»ãªä»£æ¿ææ®µã§ãã
JavaScriptã§ã®å®è£ ïŒ JavaScriptã§ã¯é¢æ°ã第äžçŽãªããžã§ã¯ãã§ããããããã³ã¬ãŒã¿ãŒã®å®è£ ã¯å®¹æã§ãã
äŸïŒã³ãŒããŒã®æ³šæããã³ã¬ãŒããã
// ããŒã¹ã³ã³ããŒãã³ã class SimpleCoffee { getCost() { return 10; } getDescription() { return 'ã·ã³ãã«ãªã³ãŒããŒ'; } } // ãã³ã¬ãŒã¿ãŒ1ïŒãã«ã¯ function MilkDecorator(coffee) { const originalCost = coffee.getCost(); const originalDescription = coffee.getDescription(); coffee.getCost = function() { return originalCost + 2; }; coffee.getDescription = function() { return `${originalDescription}ããã«ã¯å ¥ã`; }; return coffee; } // ãã³ã¬ãŒã¿ãŒ2ïŒç ç³ function SugarDecorator(coffee) { const originalCost = coffee.getCost(); const originalDescription = coffee.getDescription(); coffee.getCost = function() { return originalCost + 1; }; coffee.getDescription = function() { return `${originalDescription}ãç ç³å ¥ã`; }; return coffee; } // ã³ãŒããŒãäœæããŠãã³ã¬ãŒãããŸããã let myCoffee = new SimpleCoffee(); console.log(myCoffee.getCost(), myCoffee.getDescription()); // 10, ã·ã³ãã«ãªã³ãŒã㌠myCoffee = MilkDecorator(myCoffee); console.log(myCoffee.getCost(), myCoffee.getDescription()); // 12, ã·ã³ãã«ãªã³ãŒããŒããã«ã¯å ¥ã myCoffee = SugarDecorator(myCoffee); console.log(myCoffee.getCost(), myCoffee.getDescription()); // 13, ã·ã³ãã«ãªã³ãŒããŒããã«ã¯å ¥ããç ç³å ¥ã
é·æãšçæïŒ
- é·æïŒ å®è¡æã«ãªããžã§ã¯ãã«è²¬ä»»ã远å ããé«ãæè»æ§ãæäŸããŸããéå±€ã®äžäœã«ããæ©èœéå€ãªã¯ã©ã¹ãåé¿ããŸãã
- çæïŒ 倿°ã®å°ããªãªããžã§ã¯ããçæãããå¯èœæ§ããããŸãããã³ã¬ãŒã¿ãŒã®é åºãéèŠã«ãªãå Žåããããã¯ã©ã€ã¢ã³ãã«ãšã£ãŠãããèªæã§ãªãããšããããŸãã
ãã¡ãµãŒããã¿ãŒã³
æŠå¿µïŒ ãã¡ãµãŒããã¿ãŒã³ã¯ãã¯ã©ã¹ãã©ã€ãã©ãªããŸãã¯APIã®è€éãªãµãã·ã¹ãã ã«å¯ŸããŠãç°¡ç¥åãããé«ã¬ãã«ã®ã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸããæ ¹åºã«ããè€éããé ãããµãã·ã¹ãã ã䜿ããããããŸãã
äžè¬çãªäœ¿çšäŸïŒ åšåº«ãæ¯æããé éã®ãµãã·ã¹ãã ãé¢ããeã³ããŒã¹ã®ãã§ãã¯ã¢ãŠãããã»ã¹ã®ãããªãäžé£ã®è€éãªã¢ã¯ã·ã§ã³ã®ããã®ã·ã³ãã«ãªAPIãäœæããå Žåã§ããå¥ã®äŸãšããŠãå éšã§ãµãŒããŒãããŒã¿ããŒã¹ãããã«ãŠã§ã¢ãèšå®ããWebã¢ããªã±ãŒã·ã§ã³ãèµ·åããåäžã®ã¡ãœããããããŸãã
JavaScriptã§ã®å®è£ ïŒ
äŸïŒäœå® ããŒã³ç³è«ã®ãã¡ãµãŒã
// è€éãªãµãã·ã¹ãã class BankService { verify(name, amount) { console.log(`${name} ã®ããã« ${amount} ã®ååãªè³éãããã確èªäž`); return amount < 100000; } } class CreditHistoryService { get(name) { console.log(`${name} ã®ä¿¡çšå±¥æŽã確èªäž`); // è¯å¥œãªã¯ã¬ãžããã¹ã³ã¢ãã·ãã¥ã¬ãŒã return true; } } class BackgroundCheckService { run(name) { console.log(`${name} ã®èº«å 調æ»ãå®è¡äž`); return true; } } // ãã¡ãµãŒã class MortgageFacade { constructor() { this.bank = new BankService(); this.credit = new CreditHistoryService(); this.background = new BackgroundCheckService(); } applyFor(name, amount) { console.log(`--- ${name} ã®äœå® ããŒã³ç³è« ---`); const isEligible = this.bank.verify(name, amount) && this.credit.get(name) && this.background.run(name); const result = isEligible ? 'æ¿èª' : 'æåŠ'; console.log(`--- ${name} ã®ç³è«çµæ: ${result} ---\n`); return result; } } // ã¯ã©ã€ã¢ã³ãã³ãŒãã¯ã·ã³ãã«ãªãã¡ãµãŒããšå¯Ÿè©±ãã const mortgage = new MortgageFacade(); mortgage.applyFor('John Smith', 75000); // æ¿èª mortgage.applyFor('Jane Doe', 150000); // æåŠ
é·æãšçæïŒ
- é·æïŒ ã¯ã©ã€ã¢ã³ãããµãã·ã¹ãã ã®è€éãªå éšåäœããåãé¢ããå¯èªæ§ãšä¿å®æ§ãåäžãããŸãã
- çæïŒ ãã¡ãµãŒãããµãã·ã¹ãã ã®ãã¹ãŠã®ã¯ã©ã¹ã«çµåãããããŽãããªããžã§ã¯ããã«ãªãå¯èœæ§ããããŸããã¯ã©ã€ã¢ã³ããããæè»æ§ãå¿ èŠãšããå Žåããµãã·ã¹ãã ã¯ã©ã¹ã«çŽæ¥ã¢ã¯ã»ã¹ããããšã劚ããŸããã
æ¯ãèããã¿ãŒã³ïŒãªããžã§ã¯ãéã®ã³ãã¥ãã±ãŒã·ã§ã³ãç·šæãã
æ¯ãèããã¿ãŒã³ã¯ããªããžã§ã¯ããäºãã«ã©ã®ããã«éä¿¡ãããã«çŠç¹ãåœãŠã責任ã®å²ãåœãŠãšçžäºäœçšã®å¹æçãªç®¡çã«é¢ãããã®ã§ãã
ãªãã¶ãŒããŒãã¿ãŒã³
æŠå¿µïŒ ãªãã¶ãŒããŒãã¿ãŒã³ã¯ããªããžã§ã¯ãéã«äžå¯Ÿå€ã®äŸåé¢ä¿ãå®çŸ©ããŸãããããªããžã§ã¯ãïŒããµããžã§ã¯ãããŸãã¯ãç£èŠå¯èœãªããžã§ã¯ããïŒããã®ç¶æ ã倿Žãããšããã®ãã¹ãŠã®äŸåãªããžã§ã¯ãïŒããªãã¶ãŒããŒãïŒãèªåçã«éç¥ãããæŽæ°ãããŸãã
äžè¬çãªäœ¿çšäŸïŒ ãã®ãã¿ãŒã³ã¯ã€ãã³ãé§ååããã°ã©ãã³ã°ã®åºç€ã§ããUIéçºïŒDOMã€ãã³ããªã¹ããŒïŒãç¶æ 管çã©ã€ãã©ãªïŒReduxãVuexãªã©ïŒãã¡ãã»ãŒãžã³ã°ã·ã¹ãã ã§å€çšãããŸãã
JavaScriptã§ã®å®è£ ïŒ
äŸïŒãã¥ãŒã¹é 信瀟ãšè³Œèªè
// ãµããžã§ã¯ãïŒç£èŠå¯èœãªããžã§ã¯ãïŒ class NewsAgency { constructor() { this.subscribers = []; } subscribe(subscriber) { this.subscribers.push(subscriber); console.log(`${subscriber.name}ã賌èªããŸããã`); } unsubscribe(subscriber) { this.subscribers = this.subscribers.filter(sub => sub !== subscriber); console.log(`${subscriber.name}ã賌èªãè§£é€ããŸããã`); } notify(news) { console.log(`--- ãã¥ãŒã¹é 信瀟: ãã¥ãŒã¹ã${news}ããé ä¿¡äž ---`); this.subscribers.forEach(subscriber => subscriber.update(news)); } } // ãªãã¶ãŒã㌠class Subscriber { constructor(name) { this.name = name; } update(news) { console.log(`${this.name}ãææ°ãã¥ãŒã¹ã${news}ããåãåããŸãã`); } } const agency = new NewsAgency(); const sub1 = new Subscriber('èªè A'); const sub2 = new Subscriber('èªè B'); const sub3 = new Subscriber('èªè C'); agency.subscribe(sub1); agency.subscribe(sub2); agency.notify('äžçåžå Žã¯äžæäžïŒ'); agency.subscribe(sub3); agency.unsubscribe(sub2); agency.notify('æ°ããæè¡ã®ç»æçãªçºè¡šããããŸããïŒ');
é·æãšçæïŒ
- é·æïŒ ãµããžã§ã¯ããšãã®ãªãã¶ãŒããŒéã®ççµåãä¿é²ããŸãããµããžã§ã¯ãã¯ããªãã¶ãŒããŒããªãã¶ãŒããŒã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããŠããããšä»¥å€ããªãã¶ãŒããŒã«ã€ããŠäœãç¥ãå¿ èŠããããŸããããããŒããã£ã¹ã圢åŒã®éä¿¡ããµããŒãããŸãã
- çæïŒ ãªãã¶ãŒããŒã¯äºæž¬äžå¯èœãªé åºã§éç¥ãããŸãããªãã¶ãŒããŒãå€ãå ŽåããæŽæ°ããžãã¯ãè€éãªå Žåã«ããã©ãŒãã³ã¹ã®åé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
ã¹ãã©ããžãŒãã¿ãŒã³
æŠå¿µïŒ ã¹ãã©ããžãŒãã¿ãŒã³ã¯ã亀æå¯èœãªã¢ã«ãŽãªãºã ã®ãã¡ããªãŒãå®çŸ©ãããããããç¬èªã®ã¯ã©ã¹ã«ã«ãã»ã«åããŸããããã«ãããã¢ã«ãŽãªãºã ã¯ããã䜿çšããã¯ã©ã€ã¢ã³ãããç¬ç«ããŠãå®è¡æã«éžæããã³åãæ¿ããå¯èœã«ãªããŸãã
äžè¬çãªäœ¿çšäŸïŒ ç°ãªããœãŒãã¢ã«ãŽãªãºã ãæ€èšŒã«ãŒã«ããŸãã¯eã³ããŒã¹ãµã€ãã®éæèšç®æ¹æ³ïŒäŸïŒå®é¡ãééå¥ãå®å å¥ïŒãå®è£ ããå Žåã§ãã
JavaScriptã§ã®å®è£ ïŒ
äŸïŒéæèšç®ã¹ãã©ããžãŒ
// ã³ã³ããã¹ã class Shipping { constructor() { this.company = null; } setStrategy(company) { this.company = company; console.log(`é éã¹ãã©ããžãŒã ${company.constructor.name} ã«èšå®ããŸãã`); } calculate(pkg) { if (!this.company) { throw new Error('é éã¹ãã©ããžãŒãèšå®ãããŠããŸããã'); } return this.company.calculate(pkg); } } // ã¹ãã©ããžãŒçŸ€ class FedExStrategy { calculate(pkg) { // ééãªã©ã«åºã¥ãè€éãªèšç® const cost = pkg.weight * 2.5 + 5; console.log(`FedExã®${pkg.weight}kgã®è·ç©ã®æéã¯$${cost}ã§ã`); return cost; } } class UPSStrategy { calculate(pkg) { const cost = pkg.weight * 2.1 + 4; console.log(`UPSã®${pkg.weight}kgã®è·ç©ã®æéã¯$${cost}ã§ã`); return cost; } } class PostalServiceStrategy { calculate(pkg) { const cost = pkg.weight * 1.8; console.log(`éµäŸ¿ãµãŒãã¹ã®${pkg.weight}kgã®è·ç©ã®æéã¯$${cost}ã§ã`); return cost; } } const shipping = new Shipping(); const packageA = { from: 'New York', to: 'London', weight: 5 }; shipping.setStrategy(new FedExStrategy()); shipping.calculate(packageA); shipping.setStrategy(new UPSStrategy()); shipping.calculate(packageA); shipping.setStrategy(new PostalServiceStrategy()); shipping.calculate(packageA);
é·æãšçæïŒ
- é·æïŒ è€éãª`if/else`ã`switch`æã«ä»£ããã¯ãªãŒã³ãªä»£æ¿ææ®µãæäŸããŸããã¢ã«ãŽãªãºã ãã«ãã»ã«åãããã¹ããšä¿å®ã容æã«ããŸãã
- çæïŒ ã¢ããªã±ãŒã·ã§ã³å ã®ãªããžã§ã¯ãã®æ°ãå¢ããå¯èœæ§ããããŸããã¯ã©ã€ã¢ã³ãã¯ãé©åãªãã®ãéžæããããã«ãç°ãªãã¹ãã©ããžãŒãèªèããŠããå¿ èŠããããŸãã
ã¢ãã³ãªãã¿ãŒã³ãšã¢ãŒããã¯ãã£ã«é¢ããèå¯
å€å žçãªãã¶ã€ã³ãã¿ãŒã³ã¯æä»£ãè¶ è¶ããŠããŸãããJavaScriptã®ãšã³ã·ã¹ãã ã¯é²åããçŸä»£ã®éçºè ã«ãšã£ãŠäžå¯æ¬ ãªãã¢ãã³ãªè§£éãå€§èŠæš¡ãªã¢ãŒããã¯ãã£ãã¿ãŒã³ãçã¿åºããŸããã
ã¢ãžã¥ãŒã«ãã¿ãŒã³
ã¢ãžã¥ãŒã«ãã¿ãŒã³ã¯ãES6以åã®JavaScriptã§ãã©ã€ããŒãã¹ã³ãŒããšãããªãã¯ã¹ã³ãŒããäœæããããã«æãæ®åããŠãããã¿ãŒã³ã®1ã€ã§ãããã¯ããŒãžã£ã䜿çšããŠç¶æ ãšæ¯ãèããã«ãã»ã«åããŸãã仿¥ããã®ãã¿ãŒã³ã¯ãã€ãã£ãã®ES6ã¢ãžã¥ãŒã«ïŒ`import`/`export`ïŒã«å€§éšåãåã£ãŠä»£ããããŸãããããã¯æšæºåããããã¡ã€ã«ããŒã¹ã®ã¢ãžã¥ãŒã«ã·ã¹ãã ãæäŸããŸããES6ã¢ãžã¥ãŒã«ã¯ãããã³ããšã³ããšããã¯ãšã³ãã®äž¡æ¹ã®ã¢ããªã±ãŒã·ã§ã³ã§ã³ãŒããæŽçããããã®æšæºã§ãããããçŸä»£ã®JavaScriptéçºè ã«ãšã£ãŠã¯åºç€çãªç¥èã§ãã
ã¢ãŒããã¯ãã£ãã¿ãŒã³ïŒMVC, MVVMïŒ
ãã¶ã€ã³ãã¿ãŒã³ãšã¢ãŒããã¯ãã£ãã¿ãŒã³ãåºå¥ããããšãéèŠã§ãããã¶ã€ã³ãã¿ãŒã³ãç¹å®ã®å±æçãªåé¡ã解決ããã®ã«å¯Ÿããã¢ãŒããã¯ãã£ãã¿ãŒã³ã¯ã¢ããªã±ãŒã·ã§ã³å šäœã®é«ã¬ãã«ãªæ§é ãæäŸããŸãã
- MVC (Model-View-Controller)ïŒ ã¢ããªã±ãŒã·ã§ã³ã3ã€ã®çžäºæ¥ç¶ãããã³ã³ããŒãã³ããããªãã¡ã¢ãã«ïŒããŒã¿ãšããžãã¹ããžãã¯ïŒããã¥ãŒïŒUIïŒãã³ã³ãããŒã©ãŒïŒãŠãŒã¶ãŒå ¥åãåŠçããã¢ãã«/ãã¥ãŒãæŽæ°ïŒã«åé¢ãããã¿ãŒã³ã§ããRuby on Railsãå€ãããŒãžã§ã³ã®Angularãªã©ã®ãã¬ãŒã ã¯ãŒã¯ããããåºããŸããã
- MVVM (Model-View-ViewModel)ïŒ MVCã«äŒŒãŠããŸãããã¢ãã«ãšãã¥ãŒã®éã®ãã€ã³ããŒãšããŠæ©èœããViewModelãç¹åŸŽã§ããViewModelã¯ããŒã¿ãšã³ãã³ããå ¬éãããã¥ãŒã¯ããŒã¿ãã€ã³ãã£ã³ã°ã®ãããã§èªåçã«æŽæ°ãããŸãããã®ãã¿ãŒã³ã¯ãVue.jsã®ãããªã¢ãã³ãªãã¬ãŒã ã¯ãŒã¯ã®äžå¿ã§ãããReactã®ã³ã³ããŒãã³ãããŒã¹ã®ã¢ãŒããã¯ãã£ã«ã圱é¿ãäžããŠããŸãã
ReactãVueãAngularãªã©ã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšããå Žåãå ç¢ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«ããããã®ã¢ãŒããã¯ãã£ãã¿ãŒã³ãããã°ãã°ããå°ããªãã¶ã€ã³ãã¿ãŒã³ïŒç¶æ 管çã®ããã®ãªãã¶ãŒããŒãã¿ãŒã³ãªã©ïŒãšçµã¿åãããŠæ¬è³ªçã«äœ¿çšããŠããããšã«ãªããŸãã
çµè«ïŒãã¿ãŒã³ãè³¢ã䜿ã
JavaScriptã®ãã¶ã€ã³ãã¿ãŒã³ã¯å³æ Œãªã«ãŒã«ã§ã¯ãªããéçºè ã®æŠåšåº«ã«ãã匷åãªããŒã«ã§ãããããã¯ãœãããŠã§ã¢å·¥åŠã³ãã¥ããã£ã®éåçãªç¥æµã代衚ããäžè¬çãªåé¡ã«å¯Ÿãããšã¬ã¬ã³ããªè§£æ±ºçãæäŸããŸãã
ããããç¿åŸããéµã¯ããã¹ãŠã®ãã¿ãŒã³ãæèšããããšã§ã¯ãªããããããã解決ããåé¡ãçè§£ããããšã§ããã³ãŒãå ã§èª²é¡ã«çŽé¢ãããšãâãããå¯çµåãè€éãªãªããžã§ã¯ãçæããŸãã¯æè»æ§ã®ãªãã¢ã«ãŽãªãºã ã§ããâé©åã«å®çŸ©ããã解決çãšããŠãé©åãªãã¿ãŒã³ã«æã䌞ã°ãããšãã§ããŸãã
ç§ãã¡ã®æåŸã®ã¢ããã€ã¹ã¯ããã§ãïŒ ãŸãã¯åäœããæãã·ã³ãã«ãªã³ãŒããæžãããšããå§ããŠãã ãããã¢ããªã±ãŒã·ã§ã³ãé²åããã«ã€ããŠãèªç¶ã«é©åããç®æã§ãããã®ãã¿ãŒã³ã«åããŠã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããŠãã ãããå¿ èŠã®ãªãå Žæã«ãã¿ãŒã³ãç¡çããé©çšããªãã§ãã ãããããããè³¢æã«é©çšããããšã§ãæ©èœçã§ããã ãã§ãªããã¯ãªãŒã³ã§ã¹ã±ãŒã©ãã«ããããŠé·å¹Žã«ããã£ãŠä¿å®ããã®ã楜ããã³ãŒããæžãããšãã§ããã§ãããã